home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
fb386
/
tool
/
peer011b
/
bb011b.asm
next >
Wrap
Assembly Source File
|
1995-02-10
|
15KB
|
415 lines
10 ';**************************** BB.REX Ver0.11B **********************
20 ';*** 各プロシジャJMPル-チン ***
30 ' ;CALL番地
40 ' jmp p_no0 ;機械語プロシジャNo.0へ [拡張PEEK] &H00
50 ' jmp p_no1 ;機械語プロシジャNo.1へ [拡張POKE] &H05
60 ' jmp p_no2 ;機械語プロシジャNo.2へ [各BIOSコ-ル+α] &H0A
70 '
80 ';*** 機械語プロシジャNo.0 ***
90 ';DUM&=CALLM (&H00,SRC&,ADR&,?,??)
100 ';指定アドレスを、指定単位 "?"(1,2,4byt)で読む
110 ';読んだDATAを並べ替えるかどうか指定する("??"=1で並び替え)
120 '
130 'p_no0:
140 '
150 ';equの後ろは、十進数
160 '
170 ' src equ 4 ;スタックに積まれた数値(espからのオフセット値)
180 ' adr equ 8 ; 〃
190 ' byt equ 12 ; 〃
200 ' trn equ 16 ; 〃
210 '
220 ' mov ebp , esp ;esp(オフセット 0)を、ebp へ
230 '
240 ';読み取りバイト数のチェック
250 '
260 ' cmp [ebp+byt] , 1
270 ' jz read_one ;1なら 8bit(1byt)単位へ
280 '
290 ' cmp [ebp+byt] , 2
300 ' jz read_two ;2なら16bit(2byt)単位へ
310 '
320 ';各バイト数で読み取り
330 '
340 'read_four:
350 ' mov bx , [ebp+src] ;スタックからBASIC変数srcの数値をbxへ
360 ' mov ds , bx ;(BASIC変数srcの数値)bxをdsへ
370 ' mov ebx , [ebp+adr] ;スタックからBASIC変数adrの数値をebxへ
380 ' mov eax , ds:[ebx] ;dsセレクタとebxオフセットの示すアドレスの数
390 ' ;値をeaxへ
400 ' cmp [ebp+trn] , 1
410 ' jz transfer_four ;4Byt並び替えル-チンへ
420 '
430 'read_four_return:
440 ' ret ;BASICへ戻る
450 '
460 'read_one:
470 ' mov bx , [ebp+src]
480 ' mov ds , bx
490 ' mov ebx , [ebp+adr]
500 ' mov al , ds:[ebx] ;dsセレクタとebxオフセットの示すアドレスの数
510 ' ;値をalへ(余計な型は、書かない方がいい)
520 ' ;レジスタがalだからだろうか?
530 ' ret ;BASICへ戻る
540 '
550 'read_two:
560 ' mov bx , [ebp+src]
570 ' mov ds , bx
580 ' mov ebx , [ebp+adr]
590 ' mov ax , ds:[ebx] ;dsセレクタとebxオフセットの示すアドレスの数
600 ' ;値をaxへ
610 ' cmp [ebp+trn] , 1
620 ' jz transfer_two ;2Byt並び替えル-チンへ
630 '
640 'read_two_return:
650 ' ret ;BASICへ戻る
660 '
670 'transfer_four:
680 ' mov cl , 8
690 ' ror ax , cl ;axの"1-0"を"0-1"へ
700 ' mov cl , 16
710 ' ror eax, cl ;eaxの"3-2-0-1"を"0-1-3-2"へ
720 ' mov cl , 8
730 ' ror ax , cl ;axの"3-2"を"2-3"へ (eax="0-1-2-3")
740 ' jmp read_four_return
750 '
760 'transfer_two:
770 ' mov cl , 8
780 ' ror ax , cl ;axの"1-0"を"0-1"へ (eax="0-1")
790 ' jmp read_two_return
800 ' ;使用レジスタ bx,ebx,eax,ds,cl
810 ' ;使用レジスタ ebp,esp
820 '
830 ';*** 機械語プロシジャNo.1 ***
840 ';CALLM &H05,SRC&,ADR&,DAT&,?
850 ';指定アドレスにDAT&を、指定単位 "?"(1,2,4byt)で書き込む
860 '
870 'p_no1:
880 '
890 ';equの後ろは、十進数
900 '
910 ' sr equ 4 ;同じ文字列をEQUするとエラ-の元
920 ' ad equ 8
930 ' dat equ 12
940 ' b equ 16
950 '
960 ' mov ebp , esp
970 '
980 ';書き込みバイト数のチェック
990 '
1000 ' cmp [ebp+b] , 1
1010 ' jz write_one ;1なら 8bit(1byt)単位へ
1020 '
1030 ' cmp [ebp+b] , 2
1040 ' jz write_two ;2なら16bit(2byt)単位へ
1050 '
1060 ';各バイト数で書き込み
1070 '
1080 'write_four:
1090 ' mov bx , [ebp+sr] ;スタックからBASIC変数srcの数値をbxへ
1100 ' mov ds , bx ;(BASIC変数srcの数値)bxをdsへ
1110 ' mov ebx , [ebp+ad] ;スタックからBASIC変数adrの数値をebxへ
1120 ' mov eax , [ebp+dat];スタックからBASIC変数datの数値をeaxへ
1130 ' mov ds:[ebx] , eax ;eaxの数値をdsセレクタとebxオフセットの示す
1140 ' ;アドレスに書く
1150 ' ret ;BASICへ戻る
1160 '
1170 'write_one:
1180 ' mov bx , [ebp+sr]
1190 ' mov ds , bx
1200 ' mov ebx , [ebp+ad]
1210 ' mov al , [ebp+dat]
1220 ' mov ds:[ebx] , al ;alの数値をdsセレクタとebxオフセットの示す
1230 ' ;アドレスに書く
1240 ' ret ;BASICへ戻る
1250 '
1260 'write_two:
1270 ' mov bx , [ebp+sr]
1280 ' mov ds , bx
1290 ' mov ebx , [ebp+ad]
1300 ' mov ax , [ebp+dat]
1310 ' mov ds:[ebx] , ax ;axの数値をdsセレクタとebxオフセットの示す
1320 ' ;アドレスに書く
1330 ' ret ;BASICへ戻る
1340 '
1350 ' ;使用レジスタ bx,ebx,al,ax,eax,ds
1360 ' ;使用レジスタ ebp,esp
1370 '
1380 ';*** 機械語プロシジャNo.2 ***
1390 ';CALLM &h0A,BIOSNO&,VARPTR(R_EAX&),VARPTR(R_EBX&),VARPTR(R_ECX&),VARPTR(R_EDX&),VARPTR(R_ESI&),VARPTR(R_EDI&),VARPTR(R_DS%),VARPTR(R_ES%),VARPTR(R_FS%),VARPTR(R_GS%)
1400 '
1410 'p_no2:
1420 '
1430 ';equの後ろは、十六進数
1440 '
1450 ' tbios equ 0110h ;TBIOSセレクタ(実行用)
1460 '
1470 ' n_gra equ 0020h ;ネイティブ グラフィック BIOS
1480 ' n_mus equ 0040h ;ネイティブ マウス BIOS
1490 ' n_spr equ 0060h ;ネイティブ スプライト BIOS
1500 ' n_snd equ 0080h ;ネイティブ サウンド BIOS
1510 ' n_fnt equ 00a0h ;ネイティブ フォント BIOS
1520 ' n_mid equ 00c0h ;ネイティブ MIDI BIOS
1530 ' n_sndint equ 01a0h ;ネイティブ 音源割り込み管理 BIOS
1540 ' n_sysinf equ 01c0h ;ネイティブ システム情報 BIOS
1550 '
1560 ' dos_call equ 21h ;システムコ-ル
1570 ' ms_cdex equ 2fh ;MSCDEXのドライブ番号読み取り
1580 '
1590 ' r_exserv equ 8eh ;拡張サ-ビスル-チン BIOS
1600 ' r_key equ 90h ;キ-ボ-ド BIOS
1610 ' r_con equ 91h ;コンソ-ル BIOS
1620 ' r_gra equ 92h ;グラフィック BIOS
1630 ' r_disk equ 93h ;DISK BIOS
1640 ' r_prin equ 94h ;プリンタ- BIOS
1650 ' r_hard equ 95h ;ハ-ドコピ-BIOS
1660 ' r_t1 equ 96h ;カレンダ時計 BIOS
1670 ' r_t2 equ 97h ;タイマ管理 BIOS
1680 ' r_t3 equ 98h ;時計管理 BIOS
1690 ' r_mus equ 99h ;マウス BIOS(キ-ボ-ド接続のFMR用)
1700 ' r_rs232c equ 9bh ;rs232c BIOS
1710 ' r_beep equ 9eh ;BEEP BIOS
1720 ' r_int equ aeh ;割り込み管理 BIOS
1730 ' r_serv equ afh ;サ-ビスル-チン BIOS
1740 ' r_k1 equ ech ;かな漢字変換(表示制御) BIOS
1750 ' r_k2 equ edh ;かな漢字変換(ストリング変換) BIOS
1760 ' r_st equ fdh ;ソフトタイマ- BIOS
1770 '
1780 ';equの後ろは、十進数
1790 '
1800 ' biosno equ 4 ;スタックに積まれた数値 (espからのオフセット)
1810 ' r_eax equ 8 ;スタックに積まれたアドレス(espからのオフセット)
1820 ' r_ebx equ 12 ; 〃
1830 ' r_ecx equ 16 ; 〃
1840 ' r_edx equ 20 ; 〃
1850 ' r_esi equ 24 ; 〃
1860 ' r_edi equ 28 ; 〃
1870 ' r_ds equ 32 ; 〃
1880 ' r_es equ 36 ; 〃
1890 ' r_fs equ 40 ; 〃
1900 ' r_gs equ 44 ; 〃
1910 '
1920 ';各変数アドレスより数値を各レジスタへ
1930 ' mov ebp , esp ;esp(オフセット 0)をebp へ
1940 ' mov eax , [ebp+r_gs] ;変数r_gsのアドレスをeax へ
1950 ' mov gs , [eax] ;変数r_gsの数値をgs へ
1960 ' mov eax , [ebp+r_fs] ;変数r_fsのアドレスをeax へ
1970 ' mov fs , [eax] ;変数r_fsの数値をfs へ
1980 ' mov eax , [ebp+r_es] ;変数r_esのアドレスをeax へ
1990 ' mov es , [eax] ;変数r_esの数値をes へ
2000 ' mov eax , [ebp+r_ds] ;変数r_dsのアドレスをeax へ
2010 ' mov ds , [eax] ;変数r_dsの数値をds へ
2020 '
2030 ' mov edi , [ebp+r_edi];変数r_ediのアドレスをediへ
2040 ' mov edi , [edi] ;変数r_ediの数値をediへ
2050 ' mov esi , [ebp+r_esi];変数r_esiのアドレスをesiへ
2060 ' mov esi , [esi] ;変数r_esiの数値をesiへ
2070 ' mov edx , [ebp+r_edx];変数r_edxのアドレスをedxへ
2080 ' mov edx , [edx] ;変数r_edxの数値をedxへ
2090 ' mov ecx , [ebp+r_ecx];変数r_ecxのアドレスをecxへ
2100 ' mov ecx , [ecx] ;変数r_ecxの数値をecxへ
2110 ' mov ebx , [ebp+r_ebx];変数r_ebxのアドレスをebxへ
2120 ' mov ebx , [ebx] ;変数r_ebxの数値をebxへ
2130 ' mov eax , [ebp+r_eax];変数r_eaxのアドレスをeaxへ
2140 ' mov eax , [eax] ;変数r_eaxの数値をeaxへ
2150 '
2160 ';ネイティブBIOSチェック
2170 ' cmp word ptr [ebp+biosno] , n_gra
2180 ' jz graphic_nbios
2190 ' cmp word ptr [ebp+biosno] , n_mus
2200 ' jz mouse_nbios
2210 ' cmp word ptr [ebp+biosno] , n_spr
2220 ' jz sprite_nbios
2230 ' cmp word ptr [ebp+biosno] , n_snd
2240 ' jz sound_nbios
2250 ' cmp word ptr [ebp+biosno] , n_fnt
2260 ' jz font_nbios
2270 ' cmp word ptr [ebp+biosno] , n_mid
2280 ' jz midi_nbios
2290 ' cmp word ptr [ebp+biosno] , n_sndint
2300 ' jz sound_int_control_nbios
2310 ' cmp word ptr [ebp+biosno] , n_sysinf
2320 ' jz system_information_nbios
2330 '
2340 ';リアルBIOSチェック
2350 ' cmp [ebp+biosno] , dos_call
2360 ' jz dos
2370 ' cmp [ebp+biosno] , ms_cdex
2380 ' jz mscdex_driveno
2390 ' cmp [ebp+biosno] , r_exserv
2400 ' jz exservice_rbios
2410 ' cmp [ebp+biosno] , r_key
2420 ' jz key_rbios
2430 ' cmp [ebp+biosno] , r_con
2440 ' jz console_rbios
2450 ' cmp [ebp+biosno] , r_gra
2460 ' jz graphic_rbios
2470 ' cmp [ebp+biosno] , r_disk
2480 ' jz disk_rbios
2490 ' cmp [ebp+biosno] , r_prin
2500 ' jz printer_rbios
2510 ' cmp [ebp+biosno] , r_hard
2520 ' jz hardcopy_rbios
2530 ' cmp [ebp+biosno] , r_t1
2540 ' jz time1_rbios
2550 ' cmp [ebp+biosno] , r_t2
2560 ' jz time2_rbios
2570 ' cmp [ebp+biosno] , r_t3
2580 ' jz time3_rbios
2590 ' cmp [ebp+biosno] , r_mus
2600 ' jz mouse_rbios
2610 ' cmp [ebp+biosno] , r_rs232c
2620 ' jz rs232c_rbios
2630 ' cmp [ebp+biosno] , r_beep
2640 ' jz beep_rbios
2650 ' cmp [ebp+biosno] , r_int
2660 ' jz int_rbios
2670 ' cmp [ebp+biosno] , r_serv
2680 ' jz service_rbios
2690 ' cmp [ebp+biosno] , r_k1
2700 ' jz kanji1_rbios
2710 ' cmp [ebp+biosno] , r_k2
2720 ' jz kanji2_rbios
2730 ' cmp [ebp+biosno] , r_st
2740 ' jz softtimer_rbios
2750 '
2760 ' jmp exit
2770 '
2780 ';リアルBIOS割り込み
2790 'exservice_rbios:
2800 ' int r_exserv
2810 ' jmp exit
2820 'key_rbios:
2830 ' int r_key
2840 ' jmp exit
2850 'console_rbios:
2860 ' int r_con
2870 ' jmp exit
2880 'graphic_rbios:
2890 ' int r_gra
2900 ' jmp exit
2910 'disk_rbios:
2920 ' int r_disk
2930 ' jmp exit
2940 'printer_rbios:
2950 ' int r_prin
2960 ' jmp exit
2970 'hardcopy_rbios:
2980 ' int r_hard
2990 ' jmp exit
3000 'time1_rbios:
3010 ' int r_t1
3020 ' jmp exit
3030 'time2_rbios:
3040 ' int r_t2
3050 ' jmp exit
3060 'time3_rbios:
3070 ' int r_t3
3080 ' jmp exit
3090 'mouse_rbios:
3100 ' int r_mus
3110 ' jmp exit
3120 'rs232c_rbios:
3130 ' int r_rs232c
3140 ' jmp exit
3150 'beep_rbios:
3160 ' int r_beep
3170 ' jmp exit
3180 'int_rbios:
3190 ' int r_int
3200 ' jmp exit
3210 'service_rbios:
3220 ' int r_serv
3230 ' jmp exit
3240 'kanji1_rbios:
3250 ' int r_k1
3260 ' jmp exit
3270 'kanji2_rbios:
3280 ' int r_k2
3290 ' jmp exit
3300 'softtimer_rbios:
3310 ' int r_st
3320 ' jmp exit
3330 'dos:
3340 ' int dos_call
3350 ' jmp exit
3360 'mscdex_driveno:
3370 ' int ms_cdex
3380 ' jmp exit
3390 '
3400 '
3410 '
3420 ';ネイティブBIOS割り込み
3430 'graphic_nbios:
3440 ' push tbios ;ネイティブBIOS CALL準備
3450 ' pop fs
3460 ' call pword ptr fs:[n_gra] ;ネイティブBIOS CALL
3470 ' jmp exit
3480 'mouse_nbios:
3490 ' push tbios
3500 ' pop fs
3510 ' call pword ptr fs:[n_mus]
3520 ' jmp exit
3530 'sprite_nbios:
3540 ' push tbios
3550 ' pop fs
3560 ' call pword ptr fs:[n_spr]
3570 ' jmp exit
3580 'sound_nbios:
3590 ' push tbios
3600 ' pop fs
3610 ' call pword ptr fs:[n_snd]
3620 ' jmp exit
3630 'font_nbios:
3640 ' push tbios
3650 ' pop fs
3660 ' call pword ptr fs:[n_fnt]
3670 ' jmp exit
3680 'midi_nbios:
3690 ' push tbios
3700 ' pop fs
3710 ' call pword ptr fs:[n_mid]
3720 ' jmp exit
3730 'sound_int_control_nbios:
3740 ' push tbios
3750 ' pop fs
3760 ' call pword ptr fs:[n_sndint]
3770 ' jmp exit
3780 'system_information_nbios:
3790 ' push tbios
3800 ' pop fs
3810 ' call pword ptr fs:[n_sysinf]
3820 ' ;ここでネイティブBIOS最後
3830 '
3840 'exit: ;各レジスタの数値を各変数アドレスへ
3850 ' push ebx
3860 ' mov ebx , [ebp+r_eax]
3870 ' mov [ebx] , eax
3880 ' pop ebx
3890 ' mov eax , [ebp+r_ebx]
3900 ' mov [eax] , ebx
3910 ' mov eax , [ebp+r_ecx]
3920 ' mov [eax] , ecx
3930 ' mov eax , [ebp+r_edx]
3940 ' mov [eax] , edx
3950 ' mov eax , [ebp+r_edi]
3960 ' mov [eax] , edi
3970 ' mov eax , [ebp+r_esi]
3980 ' mov [eax] , esi
3990 '
4000 ' mov eax , [ebp+r_ds]
4010 ' mov [eax] , ds
4020 ' mov eax , [ebp+r_es]
4030 ' mov [eax] , es
4040 ' mov eax , [ebp+r_fs]
4050 ' mov [eax] , fs
4060 ' mov eax , [ebp+r_gs]
4070 ' mov [eax] , gs
4080 '
4090 ' ret
4100 '
4110 ' ;使用レジスタ eax,ebx,ecx,edx,esi,edi,ds,es,fs,gs
4120 ' ;使用レジスタ ebp,esp
4130 '
4140 ';コ-ド部分=876BYT